package controlador;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Historico;
import modelo.dominio.Usuario;
import modelo.servicio.ActiveDirectory;
import modelo.servicio.Areas;
import modelo.servicio.Usuarios;

public class UsuarioControlador extends HttpServlet {

    private void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws DAOException, ServletException, IOException {
        String accion = request.getParameter("ac") == null ? "" : request.getParameter("ac");
        PrintWriter out = response.getWriter();
        try {
            if (accion.equals("lg")) {
                validaSesion(request, response);
            } else if (accion.equals("lo")) {
                request.getSession(true).invalidate();
                response.sendRedirect(getServletContext().getContextPath());
            } else if (accion.equals("li")) {
                getServletContext().getRequestDispatcher("/jsp/usuario/login.jsp").forward(request, response);
            } else if (accion.equals("to")) {
                int pagActual, pagUltim, desde, hasta;
                pagActual    = request.getParameter("co") == null ? 1 : Integer.parseInt(request.getParameter("co"));
                hasta        = pagActual * SeccionControlador.getPaginado();
                desde        = hasta     - SeccionControlador.getPaginado() + 1;
                pagUltim     = Usuarios.instancia().obtenerTotal(3);
                String sigOk = pagUltim > hasta ? "" : "disabled='disabled'";
                //ArrayList<Seccion> secciones = Secciones.instancia().obtenerPorArea("2");//request.getSession().getAttribute("areaUsuario").toString());
                List<Usuario> users = Usuarios.instancia().obtenerPorRango(desde, hasta, Integer.parseInt(request.getSession().getAttribute("sArea").toString()));
                if (!users.isEmpty()) {
                    request.setAttribute("users", users);
                    request.setAttribute("sigOK", sigOk);
                    getServletContext().getRequestDispatcher("/jsp/usuario/listado.jsp").forward(request, response);
                } else {
                    out.println("No existen Usuarios");
                }
            } else if (accion.equals("ed")) {
                getServletContext().getRequestDispatcher("/jsp/usuario/editar.jsp").forward(request, response);
            } else if (accion.equals("bo")) {
                String login = request.getParameter("clv");
                Usuarios.instancia().eliminar(login);
                out.println("Se elimin&oacute; el Usuario con login: " + login + "<br/>");
            } else if (accion.equals("nw")) {
                getServletContext().getRequestDispatcher("/jsp/usuario/nuevo.jsp").forward(request, response);
            } else if (accion.equals("sv")) {
                Usuario usu = new Usuario();
                usu.setArea(Areas.instancia().obtenerPorId(Integer.parseInt(request.getSession().getAttribute("sArea").toString())));
                usu.setLogin(request.getParameter("login"));
                usu.setContrasena(request.getParameter("contra"));
                usu.setNombre(request.getParameter("nom"));
                usu.setApellidos(request.getParameter("apell"));
                usu.setPuesto(request.getParameter("puesto"));
                usu.setHistorico(new Historico(request.getSession().getAttribute("sUsuario").toString()));
                Usuarios.instancia().agregar(usu);
                out.println(usu.toString());
            } else if (accion.equals("up")) {
                String login = request.getParameter("login");
                Usuario usu = Usuarios.instancia().obtenerPorLogin(login);
                usu.setNombre(request.getParameter("nom"));
                usu.setApellidos(request.getParameter("apell"));
                usu.setPuesto(request.getParameter("puesto"));
                usu.setPerfil(request.getParameter("perfil"));
                usu.setHistorico(new Historico(request.getSession().getAttribute("sUsuario").toString()));
                Usuarios.instancia().actualizar(usu);
                out.println(usu.toString());
            }
        } catch (Exception e) {
            out.println(e.getMessage());
        }
    }
    
    public void validaSesion(HttpServletRequest request, HttpServletResponse response)
            throws DAOException {
        HttpSession session = request.getSession(true);
        String login, contrasena;
        login      = request.getParameter("login")      == null ? "" : request.getParameter("login");
        contrasena = request.getParameter("contrasena") == null ? "" : request.getParameter("contrasena");
        boolean enDirectorio = false;
        try {
            ActiveDirectory.getConnection(login, contrasena, "CMOCTEZUMA");
            enDirectorio = true;
        } catch (NamingException e) {
            enDirectorio = false;//Autenticacion con ActiveDirectory fallo
        } finally {
            if (enDirectorio && Usuarios.instancia().existe(login) || !enDirectorio && Usuarios.instancia().loginValido(login, contrasena)) {
                Usuario usuarioActual = Usuarios.instancia().obtenerPorLogin(login);
                session.setAttribute("sUsuario", login);
                String nombreCompleto = usuarioActual.getNombre() + " " + usuarioActual.getApellidos();
                session.setAttribute("sNombre", nombreCompleto);
                session.setAttribute("sArea", usuarioActual.getArea().getIdArea());
                session.setAttribute("sPerfil", usuarioActual.getPerfil());
                try {
                    response.sendRedirect(getServletContext().getContextPath());
                } catch (Exception ex) {
                    Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else {
                try {
                    response.sendRedirect(getServletContext().getContextPath() + "/usuario?ac=li");
                    //getServletContext().getRequestDispatcher("/usuario?ac=li").forward(request, response);
                } catch (Exception ex) {
                    Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (DAOException ex) {
            Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (DAOException ex) {
            Logger.getLogger(UsuarioControlador.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
